package handler

import (
	"fmt"
	"net/http"

	"github.com/gin-gonic/gin"
)

// =====================================================
// 统一响应格式
// =====================================================

// Response 统一API响应结构
type Response struct {
	Code    int         `json:"code"`    // 业务状态码 (0=成功, 其他=失败)
	Message string      `json:"message"` // 响应消息
	Data    interface{} `json:"data"`    // 响应数据
}

// PageResponse 分页响应结构
type PageResponse struct {
	Code    int         `json:"code"`
	Message string      `json:"message"`
	Data    interface{} `json:"data"` // 包含分页数据的对象
}

// PaginatedData 分页数据结构
type PaginatedData struct {
	Articles interface{} `json:"articles"` // 文章列表
	Total    int64       `json:"total"`    // 总数
	Page     int         `json:"page"`     // 当前页
	Size     int         `json:"size"`     // 每页数量
}

// =====================================================
// 响应辅助函数
// =====================================================

// SuccessResponse 成功响应
func SuccessResponse(c *gin.Context, data interface{}) {
	c.JSON(http.StatusOK, Response{
		Code:    0,
		Message: "success",
		Data:    data,
	})
}

// SuccessWithMessage 成功响应(自定义消息)
func SuccessWithMessage(c *gin.Context, message string, data interface{}) {
	c.JSON(http.StatusOK, Response{
		Code:    0,
		Message: message,
		Data:    data,
	})
}

// PageSuccessResponse 分页成功响应
func PageSuccessResponse(c *gin.Context, data interface{}, total int64, page, size int) {
	c.JSON(http.StatusOK, PageResponse{
		Code:    0,
		Message: "success",
		Data: PaginatedData{
			Articles: data,
			Total:    total,
			Page:     page,
			Size:     size,
		},
	})
}

// ErrorResponse 错误响应
func ErrorResponse(c *gin.Context, httpStatus int, message string) {
	c.JSON(httpStatus, Response{
		Code:    httpStatus,
		Message: message,
		Data:    nil,
	})
}

// ErrorWithCode 错误响应(自定义业务码)
func ErrorWithCode(c *gin.Context, httpStatus int, code int, message string) {
	c.JSON(httpStatus, Response{
		Code:    code,
		Message: message,
		Data:    nil,
	})
}

// =====================================================
// 参数解析辅助函数
// =====================================================

// GetIntParam 获取整数路径参数
func GetIntParam(c *gin.Context, key string) (int64, error) {
	val := c.Param(key)
	var result int64
	_, err := fmt.Sscanf(val, "%d", &result)
	return result, err
}

// GetIntQuery 获取整数查询参数
func GetIntQuery(c *gin.Context, key string, defaultValue int) int {
	val := c.DefaultQuery(key, "")
	if val == "" {
		return defaultValue
	}
	
	var result int
	_, err := fmt.Sscanf(val, "%d", &result)
	if err != nil {
		return defaultValue
	}
	return result
}

// GetBoolQuery 获取布尔查询参数
func GetBoolQuery(c *gin.Context, key string) *bool {
	val := c.Query(key)
	if val == "" {
		return nil
	}
	
	boolVal := val == "true" || val == "1"
	return &boolVal
}
